From bc515188216c290073bbd3d7c5d28bfd941637ec Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 7 May 2026 12:01:01 -0400 Subject: [PATCH] PellesC: Compile for architecture matching LIB environment variable Issue: #21536 Co-authored-by: Serguei E. Leontiev --- .../Platform/Windows-PellesC-ASM_POASM.cmake | 13 ++++++++++- Modules/Platform/Windows-PellesC-C.cmake | 11 ++++++++- Modules/Platform/Windows-PellesC.cmake | 22 ++++++++++++++++-- Tests/PellesASM/CMakeLists.txt | 12 +++++++++- Tests/PellesASM/main-IA32.asm | 23 +++++++++++++++++++ 5 files changed, 76 insertions(+), 5 deletions(-) create mode 100644 Tests/PellesASM/main-IA32.asm diff --git a/Modules/Platform/Windows-PellesC-ASM_POASM.cmake b/Modules/Platform/Windows-PellesC-ASM_POASM.cmake index 2bff21f2b7..6373a4c2b0 100644 --- a/Modules/Platform/Windows-PellesC-ASM_POASM.cmake +++ b/Modules/Platform/Windows-PellesC-ASM_POASM.cmake @@ -4,10 +4,21 @@ include (Platform/Windows-PellesC) __windows_compiler_pellesc(ASM_POASM) +if(_PellesC_ARCH STREQUAL "x64") + set(_PellesC_ASM_POASM_FLAGS " -Aamd64") +elseif(_PellesC_ARCH STREQUAL "x86") + set(_PellesC_ASM_POASM_FLAGS " -Aia32") +else() + set(_PellesC_ASM_POASM_FLAGS "") +endif() + set(CMAKE_ASM_POASM_COMPILE_OBJECT - " -Fo ") + " ${_PellesC_ASM_POASM_FLAGS} -Fo ") string(APPEND CMAKE_ASM_POASM_FLAGS_DEBUG_INIT " -Zi") string(APPEND CMAKE_ASM_POASM_FLAGS_RELEASE_INIT "") string(APPEND CMAKE_ASM_POASM_FLAGS_RELWITHDEBINFO_INIT " -Zi") string(APPEND CMAKE_ASM_POASM_FLAGS_MINSIZEREL_INIT "") + +unset(_PellesC_ASM_POASM_FLAGS) +unset(_PellesC_ARCH) diff --git a/Modules/Platform/Windows-PellesC-C.cmake b/Modules/Platform/Windows-PellesC-C.cmake index f5a3dad38c..938492e636 100644 --- a/Modules/Platform/Windows-PellesC-C.cmake +++ b/Modules/Platform/Windows-PellesC-C.cmake @@ -4,8 +4,14 @@ include (Platform/Windows-PellesC) __windows_compiler_pellesc(C) +if(_PellesC_ARCH) + set(_PellesC_C_OBJ_FLAGS " -T${_PellesC_ARCH}-coff") +else() + set(_PellesC_C_OBJ_FLAGS "") +endif() + set(CMAKE_C_COMPILE_OBJECT - " -Fo -c ") + " ${_PellesC_C_OBJ_FLAGS} -Fo -c ") # Enable Pelles C's Microsoft extensions to use Windows APIs. # The flag also disables standard definitions, so add them. @@ -15,3 +21,6 @@ string(APPEND CMAKE_C_FLAGS_DEBUG_INIT " -Zi -Ob0") string(APPEND CMAKE_C_FLAGS_RELEASE_INIT " -Ot -Ob2 -DNDEBUG=1") string(APPEND CMAKE_C_FLAGS_RELWITHDEBINFO_INIT " -Zi -Ot -Ob1 -DNDEBUG=1") string(APPEND CMAKE_C_FLAGS_MINSIZEREL_INIT " -Os -Ob1 -DNDEBUG=1") + +unset(_PellesC_C_OBJ_FLAGS) +unset(_PellesC_ARCH) diff --git a/Modules/Platform/Windows-PellesC.cmake b/Modules/Platform/Windows-PellesC.cmake index c378c2388b..513cce47e5 100644 --- a/Modules/Platform/Windows-PellesC.cmake +++ b/Modules/Platform/Windows-PellesC.cmake @@ -8,17 +8,33 @@ set(CMAKE_LINK_LIBRARY_FLAG "") set(CMAKE_BUILD_TYPE_INIT Debug) +# Select a default architecture based on the LIB search path. +string(TOLOWER "$ENV{LIB}" _PellesC_LIB) +if(_PellesC_LIB MATCHES [[[\/]+lib[\/]+win64[\/]*(;|$)]]) + set(_PellesC_ARCH "x64") +elseif(_PellesC_LIB MATCHES [[[\/]+lib[\/]+win[\/]*(;|$)]]) + set(_PellesC_ARCH "x86") +else() + set(_PellesC_ARCH "") +endif() + macro(__windows_compiler_pellesc lang) + if(_PellesC_ARCH) + set(_PellesC_LINK_FLAGS " -machine:${_PellesC_ARCH}") + else() + set(_PellesC_LINK_FLAGS "") + endif() + set(CMAKE_${lang}_CREATE_STATIC_LIBRARY " -out: ") set(CMAKE_${lang}_CREATE_SHARED_LIBRARY - " ${CMAKE_START_TEMP_FILE} -out: -implib: -dll -version:. ${CMAKE_END_TEMP_FILE}") + " ${CMAKE_START_TEMP_FILE} -out: -implib: -dll -version:.${_PellesC_LINK_FLAGS} ${CMAKE_END_TEMP_FILE}") set(CMAKE_${lang}_CREATE_SHARED_MODULE "${CMAKE_${lang}_CREATE_SHARED_LIBRARY}") set(CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS "") set(CMAKE_${lang}_USE_RESPONSE_FILE_FOR_OBJECTS 1) set(CMAKE_${lang}_LINK_EXECUTABLE - " ${CMAKE_START_TEMP_FILE} -out: -implib: -version:. ${CMAKE_END_TEMP_FILE}") + " ${CMAKE_START_TEMP_FILE} -out: -implib: -version:.${_PellesC_LINK_FLAGS} ${CMAKE_END_TEMP_FILE}") set(CMAKE_${lang}_LINK_DEF_FILE_FLAG "${CMAKE_LINK_DEF_FILE_FLAG}") @@ -29,6 +45,8 @@ macro(__windows_compiler_pellesc lang) set(CMAKE_RC_COMPILER_INIT porc) endif() enable_language(RC) + + unset(_PellesC_LINK_FLAGS) endmacro() foreach (t IN ITEMS EXE SHARED MODULE) diff --git a/Tests/PellesASM/CMakeLists.txt b/Tests/PellesASM/CMakeLists.txt index d088d44322..df283bc3c3 100644 --- a/Tests/PellesASM/CMakeLists.txt +++ b/Tests/PellesASM/CMakeLists.txt @@ -1,3 +1,13 @@ cmake_minimum_required(VERSION 4.3) project(PellesASM LANGUAGES ASM_POASM) -add_executable(PellesASM main-AMD64.asm) + +string(TOLOWER "$ENV{LIB}" env_lib) +if(env_lib MATCHES [[[\/]+lib[\/]+win64[\/]*(;|$)]]) + set(arch "AMD64") +elseif(env_lib MATCHES [[[\/]+lib[\/]+win[\/]*(;|$)]]) + set(arch "IA32") +else() + message(FATAL_ERROR "Cannot determine target architecture.") +endif() + +add_executable(PellesASM main-${arch}.asm) diff --git a/Tests/PellesASM/main-IA32.asm b/Tests/PellesASM/main-IA32.asm new file mode 100644 index 0000000000..886b029b17 --- /dev/null +++ b/Tests/PellesASM/main-IA32.asm @@ -0,0 +1,23 @@ +extern $printf:proc + +.rdata +fmt db "hello assembler world, %d arguments given", 0ah, 0 +.code +main proc + push ebp + mov ebp, esp + push dword ptr [ebp + 8] + lea eax, [fmt] + push eax + call $printf + add esp, 8 + mov eax, 0 + mov esp, ebp + pop ebp + ret +main endp + +.drectve SEGMENT + db ' -defaultlib:crt' + db ' -defaultlib:kernel32' +end