2012-03-02 41 views
26

Tôi cần biên dịch các phiên bản khác nhau của một dự án nhất định bằng cách thêm trình chuyển đổi trình biên dịch. Thông thường, tôi sẽ làm điều này bằng cách sử dụng add_definitions hoặc một cái gì đó nhưDòng lệnh CMake cho C++ #define

set_property(TARGET mylib PROPERTY COMPILE_DEFINITIONS _MYDEFINE=1) 

trong tệp CMakeLists.txt.

Tuy nhiên, trong dự án cụ thể này, Tôi không được phép sửa đổi bất kỳ nguồn nào, bao gồm tệp CMakeLists.txt.

Tôi đã hy vọng rằng một cái gì đó giống như

cmake -D_MYDEFINE=1 <path to sources> 

sẽ tạo ra một file dự án (Visual Studio 2008 trong trường hợp của tôi, nhưng không nên quan trọng) trong đó bao gồm _MYDEFINE = 1 trong định nghĩa preprocessor của nó, nhưng trên thực tế nó đã giành 't.

Tùy chọn của tôi ở đây là gì? Có một tùy chọn dòng lệnh cmake khác để đạt được điều này không? Hãy đề xuất các giải pháp không bao gồm dòng lệnh, miễn là thay đổi CMakeLists.txt của dự án là không cần thiết.

Trả lời

23

Tôi cố gắng làm theo cách này bây giờ:

tôi đã có thể thuyết phục mọi người để thêm dòng sau vào CMakeLists.txt chung:

IF (NOT DEFINED _MYDEFINE) 
    SET(_MYDEFINE <default value>) 
ENDIF() 
ADD_DEFINITIONS(-D_MYDEFINE=${_MYDEFINE}) 

(Không, nó không thực sự được gọi là "MYDEFINE" và < giá trị mặc định > chỉ là trình giữ chỗ, tôi chỉ thay thế tất cả cho ví dụ này)

Điều này không thay đổi hành vi biên dịch hiện tại mà không có cờ trình biên dịch bổ sung và do đó là thay đổi hợp lệ.

Và nó cho phép bạn làm

cmake -D_MYDEFINE=<my value> <path to sources> 

nơi định nghĩa cmake này sẽ được ánh xạ tới một C++ định nghĩa precompiler khi cmake tạo hồ sơ dự án.

9

container CMakeLists.txt giải pháp

giải pháp Tricky:

bạn chỉ đọc CMakeList.txt đường dẫn: ${path}/ReadOnlyProject/CMakeLists.txt

Tạo một CMakeList.txt mới để trên để chỉ thư viện đọc (${path}/CMakeLists.txt):

CMAKE_MINIMUM_REQUIRED(VERSION 2.8.0) 
PROJECT (FAKE_PROJECT) 

ADD_DEFINITIONS(-D_MYDEFINE=1) 

ADD_SUBDIRECTORY(ReadOnlyProject) 

Bây giờ, hãy sử dụng dự án mới của bạn (FAKE_PROJECT) để biên dịch. Nếu ReadOnlyProject không đặt trực tiếp định nghĩa trình biên dịch, nó có thể hoạt động.


Mở Visual Studio 2010:

Cố gắng sửa đổi c:\Users\${username}\AppData\Local\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props để thêm các thiết lập trình biên dịch tùy chỉnh.

Bạn nên thêm các nội dung sau:

<Project> 
    ... 
    <ItemDefinitionGroup> 
    <ClCompile> 
     <PreprocessorDefinitions>__MYDEFINE=1;%(PreprocessorDefinitions)</PreprocessorDefinitions> 
    </ClCompile> 
    </ItemDefinitionGroup> 
</Project> 
+0

Hm thư mục% APPDATA% \ Microsoft của tôi không có bất kỳ thư mục MSBuild nào (Tôi đang sử dụng Windows XP btw) –

+0

Ok, tôi đang sử dụng Visual Studio 2010. Tôi sẽ tìm các cài đặt 2008. – Naszta

+0

+1 cho bản cập nhật Microsoft.Cpp.Win32.user.props, cần thêm chỉ thị prepocessor mà không thay đổi .vcxproj – watbywbarif