2012-10-22 14 views
8

Tôi đang cố gắng sử dụng CMake để xây dựng một dự án sử dụng MSPGCC cross-compiler cho bộ vi điều khiển MSP430. Để biên dịch thành công bất kỳ chương trình đơn giản với nó, chúng ta cần phải vượt qua một lá cờ biên dịch cho thấy mục tiêu xử lý, nếu không nó không thành công như thế này:Làm thế nào để vượt qua một cờ biên dịch để thử nghiệm trình biên dịch ban đầu cmake?

$ msp430-gcc -o test test.c 
In file included from test.c:1:0: 
/usr/local/lib/gcc/msp430/4.6.3/../../../../msp430/include/msp430.h:813:2: warning: #warning Unable to identify and include MCU header, use -mmcu=MCU [-Wcpp] 
/usr/local/lib/gcc/msp430/4.6.3/../../../../msp430/bin/ld: cannot open linker script file memory.x: No such file or directory 
collect2: ld returned 1 exit status 

Do đó, nếu tôi chỉ ra bộ vi xử lý sử dụng -mmcu chuyển đổi nó hoạt động tốt. Vấn đề là, mặc dù tôi đã xác định này trong CMakeLists.txt tập tin của tôi:

cmake_minimum_required (VERSION 2.6) 

project (test-project C) 

set (SOURCES 
    test.c 
) 

add_executable (test-project ${SOURCES}) 
set (CPU_FLAG "-mmcu=msp430f148") 

set (CMAKE_C_FLAGS ${CPU_FLAG}) 
set (CMAKE_EXE_LINKER_FLAGS ${CPU_FLAG}) 

CMake phàn nàn trình biên dịch thất bại trong các thử nghiệm để biên dịch một chương trình đơn giản, mà tôi đặt cược đang xảy ra bởi vì nó có lẽ là không sử dụng các -mmcu switch (lưu ý thông điệp về việc không thể để mở mối liên kết tập tin kịch bản memory.x):

$ cd ~/git/test-project 
$ mkdir build 
$ cd build 
$ cmake -DCMAKE_TOOLCHAIN_FILE=../msp430.cmake .. 
-- The C compiler identification is GNU 4.6.3 
-- Check for working C compiler: /usr/local/bin/msp430-gcc 
-- Check for working C compiler: /usr/local/bin/msp430-gcc -- broken 
CMake Error at /usr/share/cmake-2.8/Modules/CMakeTestCCompiler.cmake:52 (MESSAGE): 
    The C compiler "/usr/local/bin/msp430-gcc" is not able to compile a simple 
    test program. 

    It fails with the following output: 

    Change Dir: /home/claudio/git/test-project/build/CMakeFiles/CMakeTmp 



    Run Build Command:/usr/bin/gmake "cmTryCompileExec2889462763/fast" 

    /usr/bin/gmake -f CMakeFiles/cmTryCompileExec2889462763.dir/build.make 
    CMakeFiles/cmTryCompileExec2889462763.dir/build 

    gmake[1]: Entering directory 
    `/home/claudio/git/test-project/build/CMakeFiles/CMakeTmp' 

    /usr/bin/cmake -E cmake_progress_report 
    /home/claudio/git/test-project/build/CMakeFiles/CMakeTmp/CMakeFiles 1 

    Building C object 
    CMakeFiles/cmTryCompileExec2889462763.dir/testCCompiler.c.o 

    /usr/local/bin/msp430-gcc -o 
    CMakeFiles/cmTryCompileExec2889462763.dir/testCCompiler.c.o -c 
    /home/claudio/git/test-project/build/CMakeFiles/CMakeTmp/testCCompiler.c 

    Linking C executable cmTryCompileExec2889462763 

    /usr/bin/cmake -E cmake_link_script 
    CMakeFiles/cmTryCompileExec2889462763.dir/link.txt --verbose=1 

    /usr/local/bin/msp430-gcc 
    CMakeFiles/cmTryCompileExec2889462763.dir/testCCompiler.c.o -o 
    cmTryCompileExec2889462763 -rdynamic 

    /usr/local/lib/gcc/msp430/4.6.3/../../../../msp430/bin/ld: cannot open 
    linker script file memory.x: No such file or directory 

    collect2: ld returned 1 exit status 

    gmake[1]: Leaving directory 
    `/home/claudio/git/test-project/build/CMakeFiles/CMakeTmp' 

    gmake[1]: *** [cmTryCompileExec2889462763] Error 1 

    gmake: *** [cmTryCompileExec2889462763/fast] Error 2 





    CMake will not be able to correctly generate this project. 
Call Stack (most recent call first): 
    CMakeLists.txt:3 (project) 

-- Configuring incomplete, errors occurred! 

Chỉ cần cho các hồ sơ, tập tin toolchain của tôi là như sau, và biến PATH của tôi cho phép nó tìm các tệp nhị phân của trình biên dịch ở /usr/local/bin:

# the name of the target operating system 
#SET(CMAKE_SYSTEM_NAME Linux) 

# which C and C++ compiler to use 
SET(CMAKE_C_COMPILER msp430-gcc) 
SET(CMAKE_CXX_COMPILER msp430-g++) 

# here is the target environment located 
SET(CMAKE_FIND_ROOT_PATH /usr/local/msp430) 

# adjust the default behaviour of the FIND_XXX() commands: 
# search headers and libraries in the target environment, search 
# programs in the host environment 
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) 
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) 
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) 

Tất cả những gì đã nói, bất cứ ai có thể cho tôi biết làm thế nào để kiểm tra mà lập cờ CMake được sử dụng để thực hiện các bài kiểm tra trình biên dịch, và làm thế nào chúng ta có thể vượt qua những lá cờ tùy chỉnh (như -mmcu, ví dụ) để nó doesn' t thất bại?

Trả lời

6

Theo Documents:

http://www.cmake.org/Wiki/CMake_Cross_Compiling#The_toolchain_file

bạn nên sử dụng điều CMakeForceCompiler

INCLUDE(CMakeForceCompiler) 

# this one is important 
SET(CMAKE_SYSTEM_NAME eCos) 

# specify the cross compiler 
CMAKE_FORCE_C_COMPILER(arm-elf-gcc GNU) 
CMAKE_FORCE_CXX_COMPILER(arm-elf-g++ GNU) 

# where is the target environment 
SET(CMAKE_FIND_ROOT_PATH /home/alex/src/ecos/install) 

# search for programs in the build host directories 
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) 
# for libraries and headers in the target directories 
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) 
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) 

(sao chép & dán từ các tài liệu)

Sử dụng nó tốt vào đây để MSP430 của tôi quá

+0

khi tôi w như sử dụng MSPGCC4 nó đã làm việc ra tốt quá, nhưng bây giờ mà tôi đang sử dụng MSPGCC mới hơn đó là thất bại trong việc kiểm tra trình biên dịch (MSPGCC4 đã ngưng và phát triển quay trở lại dự án ban đầu). Các 'INCLUDE (CMakeForceCompiler)' tiếc là không có hiệu lực. – Claudio

+2

Nó không chỉ bao gồm nó cũng là hai dòng CMAKE_FORCE_C_COMPILER (GNU-gelf-gcc) CMAKE_FORCE_CXX_COMPILER (GNU-gelf-g ++ GNU) - bạn cũng có chúng? – duselbaer

+0

Vâng, đó là nó! Tôi đã không nhận thấy CMAKE_FORCE_C_COMPILER đã thực sự ở vị trí của CMAKE_C_COMPILER. Điều này không ghi đè lên kiểm tra trình biên dịch thay vì làm cho nó sử dụng chuyển đổi -mmcu, phải không? Cảm ơn! – Claudio